package ru.bytedog.oiot.counter.bot.service;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import ru.bytedog.oiot.counter.bot.bean.RegisterUserResult;
import ru.bytedog.oiot.counter.bot.entity.BotUser;

@Slf4j
@Service
public class RegisterUserService {

    private final UserService userService;

    public RegisterUserService(UserService userService) {
        this.userService = userService;
    }

    /**
     * Проверка полной регистрации пользователя с удалением сообщения с конфиденциальными данными. Если пользователя еще нет в системе - создание
     *
     * @param user      пользователь
     * @param message   сообщение пользователя
     * @param messageId идентификатор сообщения клиента
     * @return результат регистрации клиента
     */
    public RegisterUserResult checkAndRegister(BotUser user, String message, Integer messageId) {
        log.debug("Проверка команды пользователя {} с текстом: {} ({})", user, message, messageId);
        BotUser currentUser = userService.getByChatId(user.getChatId());
        if (currentUser == null) {
            log.debug("Пользователь {} не найден, добавление нового пользователя", user.getUsername());
            BotUser newUser = userService.create(user);
            log.debug("Пользователь {} успешно добавлен", newUser.getUsername());
            return new RegisterUserResult(true, newUser, null);
        }
        if (currentUser.getStep() == RegisterUserStep.EMPTY_TOKEN_AFTER_CLEAR) {
            log.debug("У пользователя {} не установлен токен после сброса", currentUser.getUsername());
            currentUser.setStep(RegisterUserStep.EMPTY_TOKEN);
            userService.update(currentUser);
            return new RegisterUserResult(currentUser);
        }
        if (currentUser.getStep() == RegisterUserStep.EMPTY_TOKEN) {
            log.debug("У пользователя {} не установлен токен", currentUser.getUsername());
            if (StringUtils.isBlank(message)) {
                return new RegisterUserResult(currentUser);
            }
            currentUser.setOiotUserToken(message.trim());
            currentUser.setStep(RegisterUserStep.EMPTY_CLIENT_ID);
            userService.update(currentUser);
            log.debug("Пользователь {} успешно установил токен", currentUser.getUsername());

            return new RegisterUserResult(currentUser, messageId);
        }
        boolean needDeleteClientMessage = false;
        if (currentUser.getStep() == RegisterUserStep.EMPTY_CLIENT_ID) {
            log.debug("У пользователя {} не установлен идентификатор пользователя OIOT.RU", currentUser.getUsername());
            if (StringUtils.isBlank(message)) {
                return new RegisterUserResult(currentUser);
            }
            currentUser.setOiotUserId(message.trim());
            currentUser.setStep(RegisterUserStep.USER_ADDED);
            userService.update(currentUser);
            log.debug("Пользователь {} успешно установил идентификатор пользователя OIOT.RU", currentUser.getUsername());
            needDeleteClientMessage = true;
        }
        log.debug("Пользователь {} зарегистрирован", currentUser.getUsername());
        return new RegisterUserResult(currentUser, needDeleteClientMessage ? messageId : null);
    }


}
